Welcome to Hands on deep learning!

02.03.05 张量算法的基本性质

标量、向量、矩阵和任意数量轴的张量(本小节中的“张量”指代数对象)有一些实用的属性。 例如,从按元素操作的定义中可以注意到,任何按元素的一元运算都不会改变其操作数的形状。 同样,给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。 例如,将两个相同形状的矩阵相加,会在这两个矩阵上执行元素加法。

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)

B = A.clone() # 通过分配新内存,将A的一个副本分配给B

print(A)

print(A+B)

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.],

[12., 13., 14., 15.],

[16., 17., 18., 19.]])

tensor([[ 0., 2., 4., 6.],

[ 8., 10., 12., 14.],

[16., 18., 20., 22.],

[24., 26., 28., 30.],

[32., 34., 36., 38.]])

具体而言,两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号⃝)。 对于矩阵B∈Rm*n, 其中第i行和第列j的元素是bij。 矩阵A(在 (2.3.2)中定义)和的Hadamard积为:

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)

B = A.clone() # 通过分配新内存,将A的一个副本分配给B

print(A)

print(A*B)

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.],

[12., 13., 14., 15.],

[16., 17., 18., 19.]])

tensor([[ 0., 1., 4., 9.],

[ 16., 25., 36., 49.],

[ 64., 81., 100., 121.],

[144., 169., 196., 225.],

[256., 289., 324., 361.]])

将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

import torch

a = 2

X = torch.arange(24).reshape(2, 3, 4)

print(X)

print(a + X)

print((a * X).shape)

返回值:

tensor([[[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]],

[[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]]])

tensor([[[ 2, 3, 4, 5],

[ 6, 7, 8, 9],

[10, 11, 12, 13]],

[[14, 15, 16, 17],

[18, 19, 20, 21],

[22, 23, 24, 25]]])

torch.Size([2, 3, 4])